Додаток
=======

Обʼєкт додатку (application) інкапсулює контекст виконання запиту. Основне завдання додатка — 
зібрати основну інформацію про запит та передати його відповідному контролеру для подальшої обробки. 
Також додаток є централізованим сховищем зберігання конфігурації додатку. 
Саме тому додаток також називають `фронт-контролером`.

Обʼєкт додатка створюється [вхідним скриптом](/doc/guide/basics.entry) як `одинак (singleton)`.
Екземпляр додатка доступний з будь-якої його точки за допомогою [Yii::app()|yiibase::app].


Конфігурація додатку
--------------------
За замовчуванням, обʼєкт додатку — це екземпляр класу [CWebApplication], 
який може бути настроєний з використанням конфігураційного файлу (або масиву). 
Необхідні значення властивостей встановлюються у момент створення екземпляра додатку.
Альтернативний шлях налаштування додатку — розширення класу [CWebApplication].

Конфігурація — це масив пар ключ-значення, де кожний ключ являє собою імʼя властивості 
екземпляра додатку, а значення - початкове значення відповідної властивості. 
Наприклад, наступна конфігурація встановлює значення властивостей додатка
[name|CApplication::name] та [defaultController|CWebApplication::defaultController]:

~~~
[php]
array(
	'name'=>'Yii Framework',
	'defaultController'=>'site',
)
~~~

Варто відзначити, що додаток, як і більшість класів Yii, [є компонентом](/doc/guide/basics.component).
Це означає що:

- Ви не можете присвоювати значення не оголошеним в класі властивостям.
- Додаток підтримує властивості, оголошені через геттер і сеттери, тобто можна конфігурувати властивість, задану
[setImport|CModule::setImport] наступним чином:

~~~
[php]
array(
	'import'=>array(
		'application.components.*',
	),
)
~~~

Зазвичай конфігурація зберігається в окремому PHP-скрипті
(наприклад, `protected/config/main.php`). Скрипт повертає конфігураційний масив так:

~~~
[php]
return array(…);
~~~

Щоб скористатися конфігурацією, необхідно передати імʼя конфігураційного файлу як параметр 
конструктору додатка або класу [Yii::createWebApplication()], як показано нижче.
Зазвичай це робиться в [вхідному скрипті](/doc/guide/basics.entry):

~~~
[php]
$app=Yii::createWebApplication($configFile);
~~~

> Tip|Підказка: Якщо конфігурація дуже громіздка, можна розділити її на кілька файлів, 
кожний з яких повертає лише частину конфігураційного масиву. Потім, в основному конфігураційному 
файлі, необхідно підключити ці файли, використовуючи `include()`, і злити масиви-частини в єдиний 
конфігураційний масив.


Базова директорія додатка
-------------------------
Базовою директорією додатку називається коренева директорія, що містить усі основні, з точки 
зору безпеки, PHP-скрипти й дані. За замовчуванням, це піддиректорія з назвою `protected` 
у директорії, що містить вхідний скрипт. Змінити місце розташування можна змінивши властивість 
[basepath|CWebApplication::basePath] в [конфігурації додатку](#application-configuration).

Вміст базової директорії має бути закритим для веб-доступу.
При використанні веб-сервера [Apache HTTP server](http://httpd.apache.org/), 
це можна зробити, додавши в базову директорію файл `.htaccess` наступного змісту:

~~~
deny from all
~~~


Компоненти додатку
------------------
Функціональність обʼєкта додатку може бути легко модифікована й розширена завдяки компонентній архітектурі.
Додаток управляє набором компонентів, кожний з яких має специфічні можливості.
Наприклад, додаток робить попередню обробку запиту користувача, 
використовуючи компоненти [CUrlManager] і [CHttpRequest].

Змінюючи значення властивості [components|CApplication::components],
можна настроїти класи й значення властивостей(/doc/guide/basics.component)
будь-якого компоненту, що використовує додаток. Наприклад, можна зконфігурувати компонент [CMemCache] так, щоб
він використовував декілька memcache-серверів для кешування:

~~~
[php]
array(
	…
	'components'=>array(
		…
		'cache'=>array(
			'class'=>'CMemCache',
			'servers'=>array(
				array('host'=>'server1', 'port'=>11211, 'weight'=>60),
				array('host'=>'server2', 'port'=>11211, 'weight'=>40),
			),
		),
	),
)
~~~

У даному прикладі ми додали елемент `cache` до масиву `components`. 
Елемент `cache` вказує, що класом компоненту є `CMemCache`,
а також встановлює його властивість [servers|CMemcache::servers].

Для доступу до компонента додатку використовуйте `Yii::app()->ComponentId`, де 
`ComponentId` — це ідентифікатор компоненту (наприклад, `Yii::app()->cache`).

Компонент може бути деактивований шляхом установки параметра `enabled` в його конфігурації рівним `false`. 
При звертанні до деактивованого компоненту буде повернуто null.

> Tip|Підказка: За замовчуванням, компоненти додатка створюються за вимогою. 
Це означає, що екземпляр компоненту може бути не створений взагалі, у випадку, 
якщо це не потрібно при обробці користувальницького запиту. Як результат — загальна
продуктивність додатку не постраждає, навіть якщо конфігурація 
додатка включає безліч компонентів.

При необхідності обовʼязкового створення екземплярів компонентів (наприклад, [CLogRouter]) 
незалежно від того, використовуються вони чи ні, вкажіть їх ідентифікатори в якості 
конфігураційної властивості [preload|CApplication::preload].

Ключові компоненти додатку
--------------------------
Yii визначає набір компонентів ядра, що надають можливості, 
необхідні для більшості веб-додатків. Наприклад, компонент [request|CWebApplication::request] 
використовується для збору інформації про запит користувача та надає різноманітну інформацію,
таку як URL, cookies. Задаючи властивості ключових компонентів, 
можна змінювати стандартну поведінку Yii практично як завгодно.

Далі перераховані ключові компоненти, визначені класом [CWebApplication]:

   - [assetManager|CWebApplication::assetmanager]: [CAssetManager] — керує публікацією файлів ресурсів (asset files);

   - [authManager|CWebApplication::authmanager]: [CAuthManager] — контролює доступ на основі ролей (RBAC);

   - [cache|CApplication::cache]: [CCache] — надає можливості кешування даних; врахуйте, що ви
повинні вказати використовуваний клас (наприклад, [CMemCache], [CDbCache]), інакше при звертанні до компонента 
буде повернуто null;

   - [clientScript|CWebApplication::clientscript]: [CClientScript] —керує клієнтськими скриптами (javascripts і CSS);

   - [coreMessages|CApplication::coreMessages]: [CPhpMessageSource] — надає переклади системних повідомлень Yii-Фреймворка;

   - [db|CApplication::db]: [CDbConnection] — обслуговує зʼєднання з базою даних; зверніть увагу, що
для використання компонента необхідно встановити властивість [connectionString|CDbConnection::connectionString];

   - [errorHandler|CApplication::errorHandler]: [Cerrorhandler] — оброблює не піймані помилки й виключення PHP;

   - [format|CApplication::format]: [CFormatter] - форматує дані для їх подальшого відображення;

   - [messages|CApplication::messages]: [CPhpMessageSource] — надає переклади повідомлень, використаних в Yii-додатку;

   - [request|CWebApplication::request]: [CHttpRequest] — надає інформацію, що відноситься до запиту користувача;

   - [securityManager|CApplication::securityManager]: [CSecurityManager] — забезпечує функціональність,
   повʼязану з безпекою (наприклад, хешування, шифрування);

   - [session|CWebApplication::session]: [CHttpSession] — забезпечує функціональність, повʼязану із сесіями;

   - [statePersister|CApplication::statePersister]: [CStatePersister] — надає метод для збереження
глобального стану;

   - [urlManager|CWebApplication::urlManager]: [CUrlManager] — надає функції парсинга й формування URL;

   - [user|CWebApplication::user]: [CWebUser] — надає ідентифікаційну інформацію поточного користувача;

   - [themeManager|CWebApplication::themeManager]: [CThemeManager] — управляє темами оформлення.


Життєвий цикл додатку
---------------------
Життєвий цикл додатку при обробці користувальницького запиту:

   0. Попередня ініціалізація додатку через [CApplication::preinit()].

   1. Ініціалізація обробника помилок.

   2. Реєстрація компонентів ядра.

   3. Завантаження конфігурації додатку.

   4. Ініціалізація додатку [CApplication::init()]:
      - реєстрація поведінок додатку;
      - завантаження статичних компонентів додатку;

   5. Виклик події [onBeginRequest|CApplication::onBeginRequest].

   6. Обробка запиту:
      - збір інформації про запит;
      - створення контролера;
      - запуск контролера;

   7. Виклик події [onEndRequest|CApplication::onEndRequest].